﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;

using Intelsi.Entity;
using Microsoft.Practices.Unity;

namespace Intelsi.DataAcces
{
	public class PedidoDAO : MasterDataAccess,IPedidoDAO

	{
        [Dependency]
        public IDetallePedidoDAO detallePedidoDAO { get; set; }


        public void RegistarPedido(PedidoDTO pedido2)
        {
            


              var existe = (from p in Context.Pedidoes
                              where p.IdPedido.Equals(pedido2.IdPedido)
                              select p).SingleOrDefault();

                if (existe != null)

                {

                    for (int i = 0; i < pedido2.DetallePedido.Count; i++)
			        {
			            DetallePedido producto = null;

                        if(pedido2.DetallePedido[i].IdProducto != 0)
                        {

                        producto = existe.DetallePedidoes.Where(e => e.IdProducto.Equals(pedido2.DetallePedido[i].IdProducto)).SingleOrDefault();
                       
                        
                        }

                        if (producto == null)
                        {
                            var detalle = new DetallePedido()
                            {
                                IdProducto = pedido2.DetallePedido[i].IdProducto,
                                Existencia = pedido2.DetallePedido[i].Existencia,
                                Cantidad = pedido2.DetallePedido[i].Cantidad,

                            };

                            existe.DetallePedidoes.Add(detalle);
                        }
                        else
                        {
                            existe.DetallePedidoes[i].Cantidad = pedido2.DetallePedido[i].Cantidad;
                        }

			        }


                    for (int i = 0; i < existe.DetallePedidoes.Count; i++)
                            {
                                DetallePedido producto = null;
                                    {
                                        if(existe.DetallePedidoes[i].IdProducto != 0)
                                            {


                                                producto = existe.DetallePedidoes.Where(e => e.IdProducto.Equals(pedido2.DetallePedido[i].IdProducto)).SingleOrDefault();
                       
                                            }

                                        if (producto == null)
                                            {
                                                var prodexiste = existe.DetallePedidoes[i];

                                                if (prodexiste.IdProducto == 0)
                                                {
                                                    existe.DetallePedidoes.Remove(prodexiste);
                                                }
                                                else 
                                                {
                                                    existe.DetallePedidoes[i].IdProducto =Int32.Parse(null);
                                                }

                                            }
                                    }
                                
                            }



                    Context.Entry(existe).State = System.Data.EntityState.Modified;
                    Context.SaveChanges();
                   // detallePedidoDAO.RegistarDetalle(pedido.DetallePedido,pedido1.IdPedido);
                }
                else
                {
                    Entity.Pedido pedido1 = new Pedido();

                        pedido1.FechaPedio = pedido2.FechaPedio;
                        pedido1.IdProyecto = pedido2.IdProyecto;
                        pedido1.IdSupervisor = pedido2.IdSupervisor;
                        pedido1.Estado = "Pendiente";

                        foreach (var item in pedido2.DetallePedido)
	                    {
		                    var detalle = new DetallePedido();
                            detalle.IdProducto = item.IdProducto;
                            detalle.Cantidad = item.Cantidad;
                            detalle.Existencia = item.Existencia;
                            
                            pedido1.DetallePedidoes.Add(detalle); 
	                    }

                        //detallePedidoDAO.RegistarDetalle(pedido.DetallePedido,);

                        Context.Pedidoes.Add(pedido1);
                        Context.SaveChanges(); 
                 }  
        }

     

        public List<Pedido> GetFromPedidoByEstado(string estado, int id)
        {
            var query = from p in Context.Pedidoes
                        where p.IdSupervisor == id
                        select p;

            if (estado != null)
            {
                query = query.Where(p => p.Estado.ToUpper().StartsWith(estado.ToUpper()) ||
                                        p.Estado.ToUpper().Contains(estado.ToUpper())
                                       

                    );

            }

            return query.ToList();
        }

        public List<Pedido> GetFromPedidoByFechas(DateTime FecInicio, DateTime Fectermino)
        {
            var fecha = from item in Context.Pedidoes
                        where item.FechaPedio >= FecInicio && item.FechaEntrega <= Fectermino
                        select item;

            return fecha.ToList();

        }

        
        
        public PedidoDTO GetfromPedidoByIdPedido(Int32 IdPedido)
        {
            //var query = from dp in Context.DetallePedidoes
            var query = from pe in Context.Pedidoes
                        where (pe.IdPedido.Equals(IdPedido))
                        join t in Context.Trabajadors on pe.IdSupervisor equals t.IdTrabajador
                        join pr in Context.Proyectoes on pe.IdProyecto equals pr.IdProyecto

                        select new PedidoDTO
                        {

                            IdPedido = pe.IdPedido,
                            FechaPedio = pe.FechaPedio,

                            IdProyecto = pr.IdProyecto,
                            Descripcion = pr.Descripcion,
                            ordenServicio = pr.OrdenServicio,
                            empresa = pr.Empresa,

                            IdSupervisor = pe.IdSupervisor.Value,
                            NombreSuper = t.Ape_Nomb,
                            dniSuper = t.DNI,
                            numFotochSuper = t.NumFotocheck,
                            celularSuper = t.Celular,


                        };
            var pedido = query.SingleOrDefault();
            if (pedido != null)
            {

                pedido.DetallePedido = detallePedidoDAO.GetFromDetallePedidoBiIdPedido(IdPedido);
            }
            return pedido;
        }



    


        public void AprobarPedido(PedidoDTO pedido)
        {
              var existe = (from p in Context.Pedidoes
                              where p.IdPedido.Equals(pedido.IdPedido)
                              select p).SingleOrDefault();

              if (existe != null)
              {
                  existe.FechaPedio = pedido.FechaPedio;
                  existe.IdProyecto = pedido.IdProyecto;
                  existe.IdSupervisor = pedido.IdSupervisor;
                  existe.IdAprobador = pedido.IdAprobador;
                  existe.Estado = "Aceptado";

              }

              Context.Entry(existe).State = System.Data.EntityState.Modified;
              Context.SaveChanges();
        }


        public void EntregarPedido(PedidoDTO pedido)
        {
            var existe = (from p in Context.Pedidoes
                          where p.IdPedido.Equals(pedido.IdPedido)
                          select p).SingleOrDefault();

            if (existe != null)
            {
                existe.FechaPedio = pedido.FechaPedio;
                existe.FechaEntrega = pedido.FechaEntregaPedido;
                existe.IdProyecto = pedido.IdProyecto;
                existe.IdSupervisor = pedido.IdSupervisor;
                existe.IdAprobador = pedido.IdAprobador;
                existe.IdAlmacenero = pedido.IdAlmacenero;
                existe.Estado = "Entregado";

            }

            Context.Entry(existe).State = System.Data.EntityState.Modified;
            Context.SaveChanges();
        }


        public PedidoDTO GetFromPedidoByIdPedidoII(int IdPedido)
        {
            var query = from pe in Context.Pedidoes
                        where (pe.IdPedido.Equals(IdPedido))
                        join t in Context.Trabajadors on pe.IdSupervisor equals t.IdTrabajador 
                        join tr in Context.Trabajadors on pe.IdAprobador equals tr.IdTrabajador
                        join pr in Context.Proyectoes on pe.IdProyecto equals pr.IdProyecto

                        select new PedidoDTO
                        {

                            IdPedido = pe.IdPedido,
                            FechaPedio = pe.FechaPedio,

                            IdProyecto = pr.IdProyecto,
                            Descripcion = pr.Descripcion,
                            ordenServicio = pr.OrdenServicio,
                            empresa = pr.Empresa,

                            IdSupervisor = pe.IdSupervisor.Value,
                            NombreSuper = t.Ape_Nomb,
                            dniSuper = t.DNI,
                            numFotochSuper = t.NumFotocheck,
                            celularSuper = t.Celular,

                            IdAprobador = pe.IdAprobador.Value,
                            NombreAprob = tr.Ape_Nomb,
                            dniAprob = tr.DNI,
                            numFotochAprob = tr.NumFotocheck,
                            celularAprob = tr.Celular,


                        };
            var pedido = query.SingleOrDefault();
            if (pedido != null)
            {

                pedido.DetallePedido = detallePedidoDAO.GetFromDetallePedidoBiIdPedido(IdPedido);
            }
            return pedido;
        }


        public PedidoDTO GetfromPedidoByIdPedidodev(int IdPedido)
        {
            //var query = from dp in Context.DetallePedidoes
            var query = from pe in Context.Pedidoes
                        where (pe.IdPedido.Equals(IdPedido))
                        where (pe.Estado =="Entregado")
                        join t in Context.Trabajadors on pe.IdSupervisor equals t.IdTrabajador
                        join pr in Context.Proyectoes on pe.IdProyecto equals pr.IdProyecto

                        select new PedidoDTO
                        {

                            IdPedido = pe.IdPedido,
                            FechaPedio = pe.FechaPedio,
                            estado = pe.Estado,

                            IdProyecto = pr.IdProyecto,
                            Descripcion = pr.Descripcion,
                            ordenServicio = pr.OrdenServicio,
                            empresa = pr.Empresa,

                            IdSupervisor = pe.IdSupervisor.Value,
                            NombreSuper = t.Ape_Nomb,
                            dniSuper = t.DNI,
                            numFotochSuper = t.NumFotocheck,
                            celularSuper = t.Celular,


                        };
            var pedido = query.SingleOrDefault();
            if (pedido != null)
            {

                pedido.DetallePedido = detallePedidoDAO.GetFromDetallePedidoBiIdPedido(IdPedido);
            }
            return pedido;
        }





        public void cambiarEstadoPedido(PedidoDTO Pedido)
        {
            var existe = (from p in Context.Pedidoes
                          where p.IdPedido.Equals(Pedido.IdPedido)
                          select p).SingleOrDefault();

            if (existe != null)
            {

                existe.Estado = "Devuleto";

            }

            Context.Entry(existe).State = System.Data.EntityState.Modified;
            Context.SaveChanges();
        }


        public string estadoPedido(int Idpedido)
        {
            string estado = (from ped in Context.Pedidoes
                         where ped.IdPedido.Equals(Idpedido)
                         select ped.Estado).ToString();

            return estado;
        }


        public PedidoDTO GetFromPedidoByIdPedidoIII(int IdPedido)
        {
            var query = from pe in Context.Pedidoes
                        where (pe.IdPedido.Equals(IdPedido))
                        join t in Context.Trabajadors on pe.IdSupervisor equals t.IdTrabajador
                        join tr in Context.Trabajadors on pe.IdAprobador equals tr.IdTrabajador
                        join al in Context.Trabajadors on pe.IdAlmacenero equals al.IdTrabajador
                        join pr in Context.Proyectoes on pe.IdProyecto equals pr.IdProyecto

                        select new PedidoDTO
                        {

                            IdPedido = pe.IdPedido,
                            FechaPedio = pe.FechaPedio,
                            FechaEntregaPedido =pe.FechaEntrega,

                            IdProyecto = pr.IdProyecto,
                            Descripcion = pr.Descripcion,
                            ordenServicio = pr.OrdenServicio,
                            empresa = pr.Empresa,

                            IdSupervisor = pe.IdSupervisor.Value,
                            NombreSuper = t.Ape_Nomb,
                            dniSuper = t.DNI,
                            numFotochSuper = t.NumFotocheck,
                            celularSuper = t.Celular,

                            IdAprobador = pe.IdAprobador.Value,
                            NombreAprob = tr.Ape_Nomb,
                            dniAprob = tr.DNI,
                            numFotochAprob = tr.NumFotocheck,
                            celularAprob = tr.Celular,

                            IdAlmacenero = pe.IdAlmacenero.Value,
                            NombreAlmac = al.Ape_Nomb,
                            dniEntre = al.DNI,
                            numFotochEntre = al.NumFotocheck,
                            celularEntre = al.Celular,


                        };
            var pedido = query.SingleOrDefault();
            if (pedido != null)
            {

                pedido.DetallePedido = detallePedidoDAO.GetFromDetallePedidoBiIdPedido(IdPedido);
            }
            return pedido;
        }


        public List<Pedido> GetFromPedidoByEstadosolo(string estado)
        {
            var query = from p in Context.Pedidoes
                        select p;

            if (estado != null)
            {
                query = query.Where(p => p.Estado.ToUpper().StartsWith(estado.ToUpper()) ||
                                        p.Estado.ToUpper().Contains(estado.ToUpper())


                    );

            }

            return query.OrderBy(p => p.Estado).ToList();
        }
    }
}
